/** ****************************************************************************
@addtogroup UART
@{
*******************************************************************************/

#ifndef _UART_H_
#define _UART_H_


typedef USART_TypeDef UARTPort;

/// @brief 初始化
void UART_init(
	UARTPort* uart,
	uint32_t baudrate,
	USART_WordLength_TypeDef dataBits,
	USART_StopBits_TypeDef stopBits,
	USART_Parity_TypeDef parity );

/// @brief 使能/禁用 RXNE 中断
void UART_enableIrqRx(UARTPort *uart, bool sw);
/// @brief 使能/禁用 TXE 中断
void UART_enableIrqTx(UARTPort *uart, bool sw);

/// @brief 接收中断
void UART_rxIRQHandler(UARTPort *uart, FUNC_void_u8_voidp onRxChar, void *cookie);
/// @brief 发送完成中断
void UART_txIRQHandler(UARTPort *uart, FUNC_void_voidp onTxComplete, void *cookie);

/// @brief 单字符输出
uint8_t UART_putc(UARTPort *uart, uint8_t ch);
/// @brief 字符输入
uint8_t UART_getc(UARTPort *uart);

/// @brief 发送整个数据缓冲区
size_t UART_send(UARTPort *uart, const void* data, size_t len);

/// @brief 接收数据
int UART_receive(
	UARTPort *uart,			///< 串口句柄
	void* buff,				///< 接收数据缓冲区
	size_t buffSize,		///< 需要等待的最大响应字节数
	char *okFlag,       	///< OK情况下的响应数据标志
	char *failedFlag,   	///< 异常情况下的响应数据标志
	uint16_t timeoutTotal,   	///< 响应的总超时时间(ms)
	uint16_t timeoutInterval 	///< 响应的数据字符间隔超时时间(ms)
);


#endif  // _UART_H_
/// @}
